package com.zhengyun.zuul.filter;

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import io.jmnarloch.spring.cloud.ribbon.support.RibbonFilterContextHolder;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.util.StreamUtils;

import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.Charset;
import java.util.Map;

import static com.sun.org.apache.bcel.internal.classfile.Utility.printArray;

/**
 * Zuul过滤器，必须继承ZuulFilter父类。
 * 当前类型的对象必须交由Spring容器管理。使用@Component注解描述。
 * 继承父类后，必须实现父类中定义的4个抽象方法。
 * shouldFilter、 run、 filterType、 filterOrder
 */
@Component
@Slf4j
public class LoggerFilter extends ZuulFilter {

    /**
     * 过滤器的类型。可选值有：
     * pre - 前置过滤
     * route - 路由后过滤
     * error - 异常过滤
     * post - 远程服务调用后过滤
     */
    @Override
    public String filterType() {
        return "pre";
    }
    /**
     * 同种类的过滤器的执行顺序。
     * 按照返回值的自然升序执行。
     */
    @Override
    public int filterOrder() {
        return 0;
    }
    /**
     * 返回boolean类型。代表当前filter是否生效。
     * 默认值为false。
     * 返回true代表开启filter。
     */
    @Override
    public boolean shouldFilter() {
        return true;
    }

    /**
     * run方法就是过滤器的具体逻辑。
     * return 可以返回任意的对象，当前实现忽略。（spring-cloud-zuul官方解释）
     * 直接返回null即可。
     */
    @Override
    public Object run() throws ZuulException{
        System.out.println("进入zuul");
        RequestContext ctx = RequestContext.getCurrentContext();
        HttpServletRequest request = ctx.getRequest();
        try {
            InputStream in = request.getInputStream();
            String reqBbody = StreamUtils.copyToString(in, Charset.forName("UTF-8"));
            // 打印请求json参数
            if (reqBbody != null) {
                System.out.println("request body:\t" + reqBbody);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

        Map<String, String[]> map = request.getParameterMap();
        if (map != null) {
            StringBuilder sb = new StringBuilder();
            sb.append("request parameters:\t");
            for (Map.Entry<String, String[]> entry : map.entrySet()) {
                sb.append("[" + entry.getKey() + "=" + printArray(entry.getValue()) + "]");
            }
            System.out.println(sb.toString());
        }
        System.out.println(request.getParameter("adcode"));
        if ("330324".equals(request.getParameter("adcode"))) {
            // put the serviceId in `RequestContext`
            System.out.println("进入了run");
            RibbonFilterContextHolder.getCurrentContext()
                    .add("lancher", "1");
        } else {
            System.out.println("进入了run2");
            RibbonFilterContextHolder.getCurrentContext()
                    .add("lancher", "2");
        }
        return null;
    }
}
